/**
 * 溶洞土压力计算服务模块
 * 提供各类溶洞计算相关的业务逻辑处理
 * 封装溶洞算法与IPC调用之间的转换逻辑
 * 
 * 该服务模块是溶洞相关计算功能的统一入口，负责接收IPC请求，
 * 调用底层算法实现具体计算，并处理计算结果和异常情况
 */
import { CaveAlgorithms } from '../../algorithms/cave/cave';
import { RockfallAlgorithms } from '../../algorithms/cave/rockfall';

/**
 * 溶洞计算服务类
 * 封装溶洞相关计算功能，提供统一的服务接口
 * 处理计算请求并返回格式化的结果
 * 
 * 该类为静态工具类，所有方法均为静态方法，可以通过类名直接调用
 * 每个方法对应一种特定的溶洞计算类型，负责参数验证、调用算法和结果包装
 */
export class CaveService {
  /**
   * 溶洞土压力计算
   * @param params 计算参数
   * @param params.gamma_f 上覆土体容重 (kN/m³)
   * @param params.S 溶洞跨度
   * @param params.i 倾角
   * @param params.B_f 洞顶宽度 (m)
   * @returns 包含计算结果的对象
   */
  static async calculateCaveSoilPressure(params: any) {
    try {
      const { gamma_f, S, i, B_f } = params;
      const result = CaveAlgorithms.caveSoilPressure(gamma_f, S, i, B_f);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

  /**
   * 浅埋溶洞土压力计算
   * @param params 计算参数
   * @param params.gamma_f 上覆土体容重 (kN/m³)
   * @param params.h_f 上覆土厚度 (m)
   * @param params.B_f 洞顶宽度 (m)
   * @param params.lambda_ 侧压力系数
   * @param params.theta 摩擦角 (°)
   * @returns 包含计算结果的对象
   */
  static async calculateCaveSoilPressureShallow(params: any) {
    try {
      const { gamma_f, h_f, B_f, lambda_, theta } = params;
      const result = CaveAlgorithms.caveSoilPressureShallow(gamma_f, h_f, B_f, lambda_, theta);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

    /**
   * 深埋无限土体计算
   * @param params 计算参数
   * @param params.varphi_c 土体重度相关参数
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateDeepInfinite(params: any) {
    try {
      const { varphi_c } = params;
      const result = CaveAlgorithms.deepInfinite(varphi_c);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

  /**
   * qws计算
   * @param params 计算参数
   * @param params.alpha 计算角度
   * @param params.varphi_c 土体内摩擦角 (°)
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateQws(params: any) {
    try {
      const { alpha, varphi_c } = params;
      const result = CaveAlgorithms.qws(alpha, varphi_c);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

  /**
   * qwx计算
   * @param params 计算参数
   * @param params.phi 岩石内摩擦角 (°)
   * @param params.varphi_c 土体内摩擦角 (°)
   * @param params.alpha 计算角度
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateQwx(params: any) {
    try {
      const { phi, varphi_c, alpha } = params;
      const result = CaveAlgorithms.qwx(phi, varphi_c, alpha);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

  /**
   * qys计算
   * @param params 计算参数
   * @param params.m 溶洞高度系数
   * @param params.n 溶洞宽度系数
   * @param params.mu 泊松比
   * @param params.delta 接触系数
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateQys(params: any) {
    try {
      const { m, n, mu, delta } = params;
      const result = CaveAlgorithms.qys(m, n, mu, delta);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

  /**
   * qyx计算
   * @param params 计算参数
   * @param params.m 溶洞高度系数
   * @param params.n 溶洞宽度系数
   * @param params.mu 泊松比
   * @param params.delta 接触系数
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateQyx(params: any) {
    try {
      const { m, n, mu, delta } = params;
      const result = CaveAlgorithms.qyx(m, n, mu, delta);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

  /**
   * 侧向土压力计算
   * @param params 计算参数
   * @param params.gamma_f 上覆土体容重 (kN/m³)
   * @param params.h_f 上覆土厚度 (m)
   * @param params.h1 计算深度 (m)
   * @param params.lambda_1 侧压力系数
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateLateralSoilPressure(params: any) {
    try {
      const { gamma_f, h_f, h1, lambda_1 } = params;
      const result = CaveAlgorithms.lateralSoilPressure(gamma_f, h_f, h1, lambda_1);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }

  /**
   * 落石冲击荷载组合计算
   * @param params 计算参数
   * @param params.mr 落石质量 (kg)
   * @param params.Hr 落石高度 (m)
   * @param params.Tb 缓冲层厚度 (m)
   * @param params.g 重力加速度 (m/s²)
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateRockImpactLoad(params: any) {
    try {
      const { mr, Hr, Tb, g } = params;
      const result = RockfallAlgorithms.calculateRockImpactLoad(mr, Hr, Tb, g);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }
  
  /**
   * 落石冲击荷载强度计算
   * @param params 计算参数
   * @param params.Fr 冲击荷载 (kN)
   * @param params.Dr 落石直径 (m)
   * @param params.Tb 缓冲层厚度 (m)
   * @param params.beta 冲击角度 (°)
   * @returns 包含计算结果的对象 { success: boolean, data?: any, error?: string }
   */
  static async calculateRockImpactStrength(params: any) {
    try {
      const { Fr, Dr, Tb, beta } = params;
      const result = RockfallAlgorithms.rockImpactStrength(Fr, Dr, Tb, beta);
      return { success: true, data: result };
    } catch (error: any) {
      return { success: false, error: error.message };
    }
  }
}